package dao;

import java.io.Serializable;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.List;

import modelo.Cita;
import modelo.Estadocita;
import modelo.Estadousuario;
import modelo.Interesado;
import modelo.Propietario;
import modelo.Usuario;

import org.hibernate.Criteria;
import org.hibernate.FetchMode;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;

import util.HibernateUtil;

public class CitaDao implements Serializable {

	private static final long serialVersionUID = -7050232536427453863L;

	private Session session;
	SessionFactory sessionFactory = HibernateUtil.getSessionFactory();

	public CitaDao() {
		super();
	}

	
	@SuppressWarnings("unchecked")
	public List<Cita> obtenerCitas() {
		
		session=sessionFactory.openSession();
		List<Cita> citasList = null;
		/*
		session=sessionFactory.openSession();
		Criteria crit = session.createCriteria(Cita.class)
				.createAlias("persona", "persona")
				.setFetchMode("persona", FetchMode.JOIN)
				.createAlias("persona.usuarios", "usuario")
				.setFetchMode("usuario", FetchMode.JOIN)
				.createAlias("usuario.estadousuario", "estado")
				.setFetchMode("estado", FetchMode.JOIN)*/
				//
		        //.createAlias("persona.usuarios", "usuario")
		        //.createAlias("usuarios.estadousuario", "estado")
		        //.add(Restrictions.eq("estado.idEstadoUsuario", 1));		
		
		Criteria crit = session.createCriteria(Cita.class);
		crit.setFetchMode("interesado", FetchMode.JOIN);
		crit.setFetchMode("persona",FetchMode.JOIN);
		crit.setFetchMode("salon", FetchMode.JOIN);
		crit.setFetchMode("estadocita", FetchMode.JOIN);
		citasList= (List<Cita>) crit.list();
		
		/*Query query = session.createQuery("SELECT c FROM Cita c");
		citasList= (List<Cita>) query.list();*/
		
		session.close();
		return citasList;
	}
	
	public void actualizarCita(Cita cita, Estadocita estado) throws Exception {
		
		Transaction transaction = null;
		
		try{
			
			session = sessionFactory.openSession();
	        transaction=session.beginTransaction();	
	        
            cita.setEstadocita(estado);
	        session.update(cita);
	        
	        transaction.commit();
	        
	       } catch (Exception e2) {
	            //Error
	            if (transaction != null) {
	                transaction.rollback();
	                throw e2;
	              }
	        } finally { 
	            session.close();
	        }		
		
	}
	
	public void guardarCita(Cita cita) throws Exception {
		Transaction transaction = null;
		try{
			session = sessionFactory.openSession();
	        transaction=session.beginTransaction();

			//Guardo Persona (cliente)
	        Interesado interesado = cita.getInteresado();
	        session.save(interesado);
	        // Recupera el last_id de Persona
	        Long lastIdPersona = ((BigInteger) session.createSQLQuery(
					"SELECT LAST_INSERT_ID()").uniqueResult()).longValue();
			int idInteresado = new BigDecimal(lastIdPersona).intValueExact();
			//completo el cliente con su ID
			interesado.setIdInteresado(idInteresado);
			//.setIdPersona(idPersonaInsert);
			cita.setInteresado(interesado);
			//setCliente(cliente);
			
			//Registra el propietario
			session.save(cita);
			
			transaction.commit();
        } catch (Exception e1) {
            if (transaction != null) {
                transaction.rollback();
                throw e1;
            }
        } finally { 
            session.close();
        }
		
	}

}
